package DB.Boleto;

import DB.DBManager;
import DB.EntityBase;
import DB.Util;
import Model.Boletos;
import Model.Evento;
import Model.Usuario;
import br.com.nordestefomento.jrimum.bopepo.Boleto;
import br.com.nordestefomento.jrimum.domkee.comum.pessoa.endereco.Endereco;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Cedente;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Sacado;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Titulo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author pgrabin
 */
public class ControllerBoleto extends EntityBase<Boletos> {

    DBManager db;
    Connection conn;
    static ControllerBoleto uControl;

    public static ControllerBoleto getInstance() {
        if (uControl == null) {
            uControl = new ControllerBoleto();
        }

        return uControl;
    }

    public ControllerBoleto() {
        db = DBManager.getInstance();
        conn = db.getConn();
    }

    /**
     * Insere um novo BOLETO na base de dados.
     *
     * @param b o BOLETO a ser inserido.
     * @return o ID que o BOLETO recebeu, ou -1 se ocorreu algum erro.
     * @throws java.sql.SQLException
     */
    public long insert(Boletos b) throws SQLException {
        ResultSet generatedKeys = null;
        long idRetornado = -1;

        Evento evento = b.getEvento();
        Usuario usuario = b.getUsuario();

        Cedente cedente = b.getCedente();
        Sacado sacado = b.getSacado();
        Endereco endSac = b.getEndSac();
        ContaBancaria contaBancaria = b.getContaBancaria();

        Boleto boleto = b.getBoleto();
        Titulo titulo = b.getTitulo();

        PreparedStatement ps = conn.prepareStatement("INSERT INTO " + BoletoTable.TABLE_NAME + " VALUES (null, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?,?, ?, ?, ?, ?,?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
        ps.setLong(1, b.getIdInscricao()); //idInscricao

        ps.setString(2, cedente.getNome()); //Cedente nome
        ps.setString(3, cedente.getCPRF().getCodigoFormatado()); // Cadente CPF

        ps.setString(4, sacado.getNome()); // Sacado Nome
        ps.setString(5, sacado.getCPRF().getCodigoFormatado()); // Sacado CPF
        ps.setString(6, endSac.getUF().getNome()); // Endereço Sacado UF
        ps.setString(7, endSac.getLocalidade()); // Endereço Sacado Localidade
        ps.setString(8, endSac.getCEP().getCep()); // Endereço CEP
        ps.setString(9, endSac.getLogradouro()); // Endereço Sacado Logradouro

        ps.setString(10, contaBancaria.getBanco().getNome()); // NOME BANCO
        ps.setString(11, contaBancaria.getNumeroDaConta().getCodigoDaConta().toString()); // NUMERO CONTA
        ps.setString(12, contaBancaria.getNumeroDaConta().getDigitoDaConta()); // NUMERO CONTA DIGITO
        ps.setInt(13, contaBancaria.getCarteira().getCodigo()); //CARTEIRA
        ps.setInt(14, contaBancaria.getAgencia().getCodigo()); // AGENCIA
        ps.setString(15, contaBancaria.getAgencia().getDigitoVerificador()); // AGENCIA DIGITO

        ps.setString(16, titulo.getNumeroDoDocumento());
        ps.setString(17, titulo.getNossoNumero()); // NUMERO DOCUMENTO
        ps.setString(18, titulo.getDigitoDoNossoNumero()); // NOSSO NUMERO DIGITO
        ps.setString(19, Util.getFormatoData().format(titulo.getDataDoDocumento())); // DATA DOCUMENTO
        ps.setString(20, Util.getFormatoData().format(titulo.getDataDoVencimento())); // DATA VENCIMENTO
        ps.setString(21, titulo.getValor().toString()); // VALOR

        ps.setString(22, boleto.getLocalPagamento()); // LOCAL PAGAMENTO
        ps.setString(23, boleto.getInstrucaoAoSacado()); // INSTRUCAO SACADO

        ps.setString(24, boleto.getInstrucao1()); // INSTRUCAO 1
        ps.setString(25, boleto.getInstrucao2()); // INSTRUCAO 2
        ps.setString(26, boleto.getInstrucao3());// INSTRUCAO 3
        ps.setString(27, boleto.getInstrucao4());// INSTRUCAO 4

        int affectedRows = ps.executeUpdate();
        if (affectedRows == 0) {
            throw new SQLException("Creating user failed, no rows affected.");
        }
        generatedKeys = ps.getGeneratedKeys();
        if (generatedKeys.next()) {
            idRetornado = generatedKeys.getLong(1);
        } else {
            throw new SQLException("Creating user failed, no generated key obtained.");
        }

        return idRetornado;
    }

    /**
     * Retorna a quantidade de registros na tabela.
     *
     * @return a quantidade de registros;
     */
    @Override
    public int getRowsCount() {
        return db.getTableCount(BoletoTable.TABLE_NAME);
    }

    @Override
    public long update(Boletos novo) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public int delete(long id) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Boletos getByID(long id) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public ArrayList<Boletos> getAll() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Boletos getFromResultSet(ResultSet rs) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
